包体积-kotlin

包体积

自定义 ViewModel 的 Lazy

@MainThread
inline fun <reified VM : ViewModel> Fragment.defaultActivityViewModels(
): Lazy<VM> = DefaultFragmentViewModelLazy(
    VM::class,this,needRequestActivity = true
)

class DefaultFragmentViewModelLazy<VM : ViewModel> (
    private val viewModelClass: KClass<VM>,
    private val fragment: Fragment,
    private val needRequestActivity: Boolean = false
) : Lazy<VM> {
    private var cached: VM? = null

    override val value: VM
        get() {
            val viewModel = cached
            return if (viewModel == null) {
                val factory = if(needRequestActivity) fragment.requireActivity().defaultViewModelProviderFactory else fragment.defaultViewModelProviderFactory
                val store = if(needRequestActivity) fragment.requireActivity().viewModelStore else fragment.viewModelStore
                ViewModelProvider(
                    store,
                    factory,
                    if(needRequestActivity) fragment.requireActivity().defaultViewModelCreationExtras else fragment.defaultViewModelCreationExtras
                ).get(viewModelClass.java).also {
                    cached = it
                }
            } else {
                viewModel
            }
        }

    override fun isInitialized(): Boolean = cached != null
}

class DefaultViewModelLazy<VM : ViewModel> (
    private val viewModelClass: KClass<VM>,
    private val storeProducer: ViewModelStore,
    private val factoryProducer: Factory,
    private val extrasProducer: CreationExtras
) : Lazy<VM> {
    private var cached: VM? = null

    override val value: VM
        get() {
            val viewModel = cached
            return if (viewModel == null) {
                val factory = factoryProducer
                val store = storeProducer
                ViewModelProvider(
                    store,
                    factory,
                    extrasProducer
                ).get(viewModelClass.java).also {
                    cached = it
                }
            } else {
                viewModel
            }
        }

    override fun isInitialized(): Boolean = cached != null
}

inline fun <reified VM : ViewModel> Fragment.defaultViewModels(): Lazy<VM> {
    return DefaultFragmentViewModelLazyclass,this
}

inline fun <reified VM : ViewModel> ComponentActivity.defaultViewModels(): Lazy<VM> {
    return DefaultViewModelLazyclass, viewModelStore , defaultViewModelProviderFactory, defaultViewModelCreationExtras
}